import os
import sys

# 如果当前代码文件运行测试需要加入修改路径，否则后面的导包出现问题
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, os.path.join(BASE_DIR))
import pymongo
import pandas as pd


class UpdateUserProfile():

    def __init__(self):
        client = pymongo.MongoClient(host='127.0.0.1', port=27017)
        # 进入数据库（或者创建）
        self.DB = client['movierec']

    # 更新用户行为数据
    def update_user_action(self):

        # 拿到用户日志数据(取到全部的日志数据)！！！
        user_log_Collection = self.DB['user_log']
        # 拿到视频的特征数据
        video_profile_Collection = self.DB['video_profile']
        # 用户行为和视频特征相关联成为一张表
        user_log_df = pd.DataFrame(list(user_log_Collection.find()))

        # 将用户的行为日志合并
        ud = user_log_df.groupby(["uid", "bv"]).agg(
            {"click": "max", "like": "max", "fav": "max", "operationDate": "max"}).reset_index()
        video_profile_df = pd.DataFrame(list(video_profile_Collection.find()))
        user_vidoe_df = pd.merge(ud, video_profile_df, how="left", on="bv")
        user_vidoe_df = user_vidoe_df[['uid', 'bv', 'click', 'like', 'fav', 'operationDate', 'profile']]

        # 更新用户的行为表（严格一个用户对应一个文章！！不存在多次对一个文章的不同操作）
        user_action_collection = self.DB['user_action']
        user_action_collection.drop()
        user_action_collection.insert_many(user_vidoe_df.to_dict('records'))

    # 更新用户画像
    def update_user_info(self):
        # 拿到用户行为表
        user_action_collection = self.DB['user_action']
        user_action_df = pd.DataFrame(list(user_action_collection.find()))
        # 对文章特征数据爆炸处理
        raw_UserProfile_df = user_action_df.explode('profile')[
            ['uid', 'operationDate', 'click', 'like', 'fav', 'profile']]
        # 更新用户画像
        self.save_weight(raw_UserProfile_df=raw_UserProfile_df)
        pass

    # 定义用户-标签权重计算公式
    def save_weight(self, raw_UserProfile_df):
        user_profile_collection = self.DB['user_profile']
        user_profile_collection.drop()
        # 设置权重系数
        weightsOfcation = {
            "collect": 5,
            "click": 3,
            "like": 4
        }
        import numpy as np
        from datetime import datetime
        uprofiles = []
        for index, row in raw_UserProfile_df.iterrows():
            # print(datetime.now() - datetime.strftime(row['operationDate'],'%Y-%M-%d %H:%M:%S'))
            # 计算时间衰减系数
            t = datetime.now() - row['operationDate']
            # 衰减系数
            time_expr = 1 / (np.log(t.days + 1) + 1)
            # 合并行为系数
            weight = (row.click * weightsOfcation['click'] + row.like * weightsOfcation['like'] + row.fav *
                      weightsOfcation['collect']) * time_expr
            # 更新用户画像表
            uprofile = {
                'uid': row['uid'],
                'profile': row['profile'],
                'weight': weight
            }
            uprofiles.append(uprofile)
        user_profile_collection.insert_many(uprofiles)

